package models.dao;

import java.sql.*;
import java.util.LinkedList;
import java.util.List;

import models.entity.Usuario;
import utilidades.DataBaseInstance;

public class UsuarioDao {

    protected Connection getConnection() {
        return DataBaseInstance.getInstanceConnection();
    }
    public Connection conectar(){
        return getConnection();
    }
    public void testConection(){
        getConnection();
    }

    public List<Usuario> findAll() {
        List<Usuario> listaUsuario = new LinkedList<Usuario>();
        ResultSet result = null;

        try {

            String query = "SELECT * FROM usuarios";
            Statement stmt = getConnection().createStatement();
            result = stmt.executeQuery(query);

            while (result.next()) {
              
                Usuario usuario = new Usuario();
                usuario.setId(result.getInt("codigo"));
                usuario.setNombre(result.getString("nombre"));
                usuario.setApellido(result.getString("apellido"));
                usuario.setUser(result.getString("usuario"));
                usuario.setClave(result.getString("clave"));    
                usuario.setPrivilegio(result.getInt("privilegio"));                     
                listaUsuario.add(usuario);
                
            }

            result.close();
            stmt.close();
            closeConnection();

        } catch (SQLException se) {
            System.out.println(se.toString());
            System.err.println("Se ha producido un error de BD.");
            System.err.println(se.getMessage());
        }

        return listaUsuario;
    }

    public Usuario findById(int usuarioId) {
        ResultSet result = null;
        Usuario usuario = null;

        try {
            // Componemos la sentencia SQL para obtener los usuarios.
            String query = "SELECT * FROM USUARIOS WHERE  codigo = ?";

            // Ejecutamos la query y obtenemos el resultado.
            PreparedStatement stmt = getConnection().prepareStatement(query);
            stmt.setInt(1, usuarioId);
            result = stmt.executeQuery();

            // Vemos si no ha devuelto ningun resultado.
            if (!result.next()) {
                throw new SQLException();
            }

            // Construimos una VO para el usuario.
            usuario = new Usuario();
            usuario.setId(result.getInt("codigo"));
            usuario.setNombre(result.getString("nombre"));
            usuario.setApellido(result.getString("apellido"));         
            usuario.setUser(result.getString("usuario"));  
            usuario.setClave(result.getString("clave"));      
            usuario.setPrivilegio(result.getInt("privilegio"));              
            
            
            result.close();
            stmt.close();
            closeConnection();

        } catch (SQLException se) {
            System.err.println("Se ha producido un error de BD.");
            System.err.println(se.getMessage());
        }

        return usuario;
    }

    public void save(Usuario usuario) {
System.out.println("INTO ....");
        PreparedStatement saveUser;
        try {

            if (usuario.getId() == 0) {
                
                  System.out.println("INSERT INTO  ....");
                
                saveUser = getConnection().prepareStatement(
                 "INSERT INTO  USUARIOS (nombre, apellido, usuario, clave, privilegio) "
                                    + "VALUES (?, ?, ?,?,?)" );
                saveUser.setString(1, usuario.getNombre());
                saveUser.setString(2, usuario.getApellido());
                saveUser.setString(3, usuario.getUser());
                saveUser.setString(4, usuario.getClave());
                saveUser.setInt(5, usuario.getPrivilegio());
                
                
                
            } else {
                System.out.println("UPDATE ....");
                saveUser = getConnection().prepareStatement(
                        "UPDATE USUARIOS SET   "
                                + "nombre = ?, "
                                + "apellido = ?, "
                                + "usuario = ?, "
                                + "clave = ?, "    
                                + "privilegio = ?"                                   
                                + "WHERE  codigo = ?");
                
                saveUser.setString(1, usuario.getNombre());
                saveUser.setString(2, usuario.getApellido());
                saveUser.setString(3, usuario.getUser());
                saveUser.setString(4, usuario.getClave());
                saveUser.setInt(5, usuario.getPrivilegio());
                saveUser.setInt(6, usuario.getId());
            }

            saveUser.executeUpdate();
            closeConnection();
        } catch (SQLException se) {
            System.err.println("Se ha producido un error de BD.");
            System.err.println(se.getMessage());
        }
    }

    public void delete(Usuario usuario) {
        PreparedStatement saveUser;
        try {

            if (usuario.getId() > 0) {
                saveUser = getConnection().prepareStatement(
                        "DELETE FROM usuarios WHERE codigo = ?");

                saveUser.setInt(1, usuario.getId());
                saveUser.executeUpdate();
            }


            closeConnection();
        } catch (SQLException se) {
            System.err.println("Se ha producido un error de BD.");
            System.err.println(se.getMessage());
        }
    }

    protected void closeConnection() {
        DataBaseInstance.closeConnection();
    }
}
